#!/usr/bin/env python
import os
import json
from pathlib import Path
from jinja2 import Environment, FileSystemLoader, Template

"""
prompt 动态提示词配置
"""
PROMPT_TYPE = ["form", "natural"]
ROOT_DIR = Path(__file__).parent.parent
PROMTP_CONDIG_FILE_PATH = os.path.join("config", "prompt")
PROMPT_RESOURCE_PATH = os.path.join("resource", "prompt")

class PromptService:
    def __init__(self, app: str, version: str):
        self.app = app
        self.version = version
        self.config_path = None
        self.resource_path = None
        self.config = {}

    def check_config(self):
        '''
        检查应用配置文件是否存在
        '''
        self.config_path = os.path.join(ROOT_DIR, PROMTP_CONDIG_FILE_PATH, self.app)
        if not os.path.exists(self.config_path):
            raise Exception(f"应用配置文件不存在：{self.app}")

        self.resource_path = os.path.join(ROOT_DIR, PROMPT_RESOURCE_PATH, self.app)
        if not os.path.exists(self.resource_path):
            raise Exception(f"应用资源文件不存在：{self.resource_path}")

        # 读取配置文件
        config_file_path = os.path.join(str(self.config_path), "config.json")
        with open(config_file_path, "r", encoding="utf-8") as f:
            config = f.read()

        # 解析配置文件
        self.config = json.loads(config)

        return True

    def get_prompt_list(self, type: str = PROMPT_TYPE[0]):
        '''
        获取指定应用、指定版本、指定类型下prompt列表
        :param type: prompt类型
        '''
        try:
            self.check_config()

            return self.config[self.version][type]

        except Exception as e:
            raise Exception(f"获取prompt列表失败：{e}")
        

    def get_prompt(self, type: str = "form", name: str = "", **context):
        '''
        获取指定应用、指定版本、指定类型、指定名称下prompt信息
        :param type: prompt类型
        :param name: prompt名称
        '''
        try:
            self.check_config()

            prompt_config = self.config[self.version][type][name]

            # 生成prompt本地文件读取目录，目录地址为markdown/版本号/prompt名称.md
            prompt_file_path = os.path.join(ROOT_DIR, PROMPT_RESOURCE_PATH, self.app, f"{prompt_config['file']}")

            # 判断文件是否存在
            if not os.path.exists(prompt_file_path):
                raise Exception(f"prompt 文件不存在：{prompt_file_path}")

            # 使用 Jinja2 的 FileSystemLoadzzer 加载模板
            template_dir = os.path.join(ROOT_DIR, PROMPT_RESOURCE_PATH, self.app)
            env = Environment(loader=FileSystemLoader(template_dir))
            
            # 渲染模板
            template = env.get_template(prompt_config['file'])
            rendered_content = template.render(**context)

            return rendered_content
        except Exception as e:
            raise Exception(f"获取prompt失败：{e}")
